package com.gimi.cloud.bbp.commonService.redis;

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;

import java.util.List;
import java.util.concurrent.TimeUnit;

/**
 * redis相关操作方法
 * @author  luck
 * @date 2017-09-28
 */
public interface RedisService {

    /**
     * 设置键值对
     *
     * @param key
     * @param value
     * @return
     */
    boolean set(String key, String value);

    /**
     * 设置键值对,且有过期时间
     * @param key
     * @param value
     * @param expireTime
     * @param timeUnit
     * @return
     */
    boolean set(final String key, final String value, Long expireTime, TimeUnit timeUnit);

    /**
     * 根据单个键获取值
     *
     * @param key
     * @return
     */
    String get(String key);

    /**
     * 删除指定键
     *
     * @param key
     * @return
     */
    Long del(String key);

    boolean expire(String key, long expire);

    /**
     * 设置一个集合类至redis中，内部采用JsonUtil.toJSON转化为json字符串
     * @param key redisKey
     * @param list 待设置的集合
     * @param <T>
     * @return 设置结果
     */
    <T> boolean setList(String key, List<T> list);

    /**
     * 根据reidsKey获取指定类型的集合
     * @param key rediskey
     * @param clz 返回集合类型
     * @param <T>
     * @return 获取结果<br/>警告：未获取到，返回null
     */
    <T> List<T> getList(String key, Class<T> clz);

    long lpush(String key, Object obj);

    long rpush(String key, Object obj);

    String lpop(String key);

    void lock(String key, long timeout);

    void unlock(String key);

    /**
     * 获取JsonConfig redis数据
     * @param redisKey 带获取的redisKey
     * @return 获取结果<br/>警告：未获取到，返回null
     */
    JSONObject getJsonObjectByKey(String redisKey);

    /**
     * 根据rediskey获取指定的JSONArray类型数据
     * @param redisKey 待获取的redisKey
     * @return 获取结果,<br/>警告：未获取到，返回null
     *
     */
    JSONArray getJSONArrayByKey(String redisKey);

    /**
     * 获取指定类型的redis数据
     * 内部采用fastJSON转化
     * @param redisKey 待获取的redisKey
     * @param clazz 待获取的对象类型
     * @param <T>
     * @return 获取结果 <br/>警告：未获取到，返回null
     */
    <T> T getObjectByKey(String redisKey, Class<T> clazz);

    /**
     * 设置一个对象到redis中，不会过期<br/>注意：内部采用：FastJSON.toJSONString 进行转化
     * @param redisKey 待设置的rediskey
     * @param obj 待设置到redis的对象
     */
    void setObject(String redisKey, Object obj);

    /**
     * 设置一个对象到redis中<br/>注意：内部采用：FastJSON.toJSONString 进行转化
     * @param redisKey 待设置的rediskey
     * @param obj 待设置到redis的对象
     * @param expireTime 过期时间
     * @param timeUnit 时间单位
     */
    void setObject(String redisKey, Object obj, Long expireTime, TimeUnit timeUnit);

    /**
     * 获取配置通过key（先从redis中获取，然后从数据库获取）
     * @param key 待获取的配置
     * @return 获取结果
     */
    String getConfigByKey(String key);

    /**
     * 根据key值获取JSON配置数据
     * @param key 待获取的配置(自带前缀)
     * @return 查询结果
     */
    JSONObject getJSONObjectConfigByKey(String key);

    /**
     * 根据key值获取JSONArray配置数据
     * @param key 待获取的配置(自带前缀)
     * @return 查询结果
     */
    JSONArray getJSONArrayConfigByKey(String key);

    /**
     * 获取配置通过key（先从redis中获取，然后从数据库获取）
     * @param key 待获取的配置
     * @return 获取结果
     */
    Integer getIntegerConfigByKey(String key);

    /**
     * 获取配置通过key（先从redis中获取，然后从数据库获取）
     * @param key 待获取的配置
     * @return 获取结果
     */
    Double getDoubleConfigByKey(String key);

}
